package com.rgdcx.sys.controller;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import com.rgdcx.sys.constant.SysConstant;
import com.rgdcx.sys.pojo.User;
import com.rgdcx.sys.pojo.UserVo;
import com.rgdcx.sys.service.IUserService;
import com.rgdcx.sys.utils.WebUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 登录控制器
 */
@Controller
@RequestMapping("login")
public class LoginController {
    @Autowired
    private IUserService userService;

    // 跳转到登录页面
    @RequestMapping("toLogin")
    public String toLogin(){
        return "system/main/login";
    }

    /**
     * 生成验证码
     */
    @RequestMapping("getCode")
    public void getCode(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        // 定义验证码图形的长度宽度和符号和干扰线
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(116, 36, 4, 5);
        // 将生成的验证码放到session中
        session.setAttribute("code", lineCaptcha.getCode());
        // 获取输出流
        ServletOutputStream outputStream = response.getOutputStream();
        // 将数据以图片的方式输出
        ImageIO.write(lineCaptcha.getImage(), "JPEG", outputStream);
    }

    /**
     * 登录方法
     */
    @RequestMapping("login")
    public String login(UserVo userVo, Model model){
        // 获取验证码
        String code = WebUtils.getHttpSession().getAttribute("code").toString();
        // 判断用户输入的验证码和session中的验证码是否一致
        if (userVo.getCode().equals(code)) {
            // 验证码一样，验证用户名或密码是否正确
            // 通过用户输入的用户名和密码查询用户信息
            User user = userService.login(userVo);
            if (null != user){
                // 如果用户存在，登录成功，将用户信息放到session中
                WebUtils.getHttpSession().setAttribute("user", user);
                // 跳转到index页面
                return "system/main/index";
            }else {
                // 用户不存在，用户名或密码错误
                model.addAttribute("error", SysConstant.USER_LOGIN_ERROR_MSG);
                // 重新跳转到登录页面
                return "system/main/login";
            }
        }else {
            // 验证码错误
            model.addAttribute("error", SysConstant.USER_LOGIN_CODE_ERROR_MSG);
            // 重新跳转到登录页面
            return "system/main/login";
        }
    }
}
